﻿#pragma once
#include "YCodec.h"
#include <QDebug>
#include <QString>

#include <mutex>
#include <vector>
struct SwsContext;


/// <summary>
/// 此处是视频编码器
/// </summary>
class YEncoder :public YCodec
{
public:
    //////////////////////////////////////////////////////////////
    /// 编码数据 线程安全 每次新创建AVPacket
    /// @para frame 空间由用户维护
    /// @return 失败范围nullptr 返回的AVPacket用户需要通过av_packet_free 清理
    AVPacket* Encode(const AVFrame* frame);


    //////////////////////////////////////////////////////////////
    //返回所有编码缓存中AVPacket
    std::vector<AVPacket*> End();


    void InitSwsCtx();
    void scale(uint8_t* inData, AVFrame* frame);
    void Release();


public:
	YEncoder();
	~YEncoder();

private:
    AVCodecContext* mContext = nullptr;  //编码器上下文
    std::mutex mMutex;               //编码器上下文锁
    SwsContext *swsCtx = nullptr;//像素格式转换
};
